/**
 * Created by meil01 on 2019.
 */
 import jQuery  from 'jquery'
 import { cstAdapter } from './form-api-adapter';
 import { mysoftForm } from './form-api';

jQuery.extend({
    rndNum:function(n){
        var rnd="";
        for(var i=0;i<n;i++)
            rnd+=Math.floor(Math.random()*10);
        return rnd;
    },
    flowStatus:{ //流程状态枚举，暂时只能提供标识start,draft,other
        start:"start",
        draft:"draft",
        restart:"restart",
        other:""
    },
    cstAdapterEvts:{
        form_loaded:"form_loaded", //外面表单加载完毕，数据计算完毕后ok后触发
        form_check_req:"form_check_req",//表单校验必填时触发
        form_save_data:"form_save_data", //保存表单
        execute_business:"execute_business",
        get_cf_data:"get_cf_data",//需要或取定制表单数据时触发，提交前的动作
        get_cf_html:"get_cf_html"//要获取定制表单的html时触发，打印时用的
    },
    cf:function(options){
        var el = options.el;
        if(!el || el.length == 0) return;
        el = el[0] == "#"?el:"#"+el;

        var $cf = jQuery(el);
        $cf.data("form_options",options);
        $cf.data("form_mode",options.mode);
        $cf.data("print",jQuery.print);
        $cf.data("readonly",options.readonly);
        $cf.data("package_id",options.package_id);
        $cf.data("business_id",options.business_id);
        $cf.data("process_id",options.process_id);
        $cf.data("server_address",options.server_address);
        $cf.data("user_name",options.user_name);
        $cf.data("user_id",options.user_id);
        // $cf.data("flow_status",options.flow_status);

        $cf.data("cf_setting",options.cf_setting); //
        $cf.data("ori_data",options.ori_data);
        $cf.data("c_data",options.ori_data.form.data_control);
        $cf.data("token",options.cf_setting.token||""); //
        jQuery(el).data("ff_data",options.ff_data||{});          

        var iframeId = "cf_iframe";//+jQuery.rndNum(5);
        $cf.data("cf_id",iframeId);

        var url = $cf.data("cf_setting").url_pc;
        var url_print = $cf.data("cf_setting").url_print;
        
        if(options.print && url_print){
            //打印模式，如果单独配置了打印地址，就使用这个单独的打印地址
            url = url_print;
        }
        var regex = /^http(s)?:\/\/(.*?)\//;
        var arr = url.match(regex);
        $cf.data("cst_host","");
        if(arr && arr.length>0 && arr[0] && typeof arr[0] === "string" && arr[0].toLowerCase().indexOf("http") == 0){
            $cf.data("cst_host",arr[0]);
        }
        
        var $iframe = jQuery("<iframe id='"+iframeId+"' class='"+iframeId+" custom-from' src='"+url+"' style='width:100%;' frameborder='no' border='0' marginwidth='0' marginheight='0' scrolling='no'></iframe>");
        $cf.append($iframe);
        if(options.print) $iframe.hide();
        var targetWindow = document.getElementById(iframeId).contentWindow;
        var initHandler = function(){
            cstAdapter.bindFormEvents($cf,iframeId,jQuery.cstAdapterEvts);
            window.cstClient = mysoftForm.api.client.create({
                targetWindow : targetWindow,
                targetOrigin : "*"
            },cstAdapter,null);
            window.cstClient.init();
        };
        try{
            //有一次发现在一个ie11下会失败(兼容方案)
            jQuery(targetWindow.document).ready(initHandler)
        }catch(ex){
            jQuery(jQuery("#"+iframeId).context).ready(initHandler);
        }            
        
        $cf.on("ff_ctl_erro",function(evt,erroMsg,eTag){
            options.ffErro && options.ffErro(erroMsg,eTag);
        });
        
        jQuery.fn.extend({
            
            //重写必填校验方法
            checkRequired:function(fn_suc,fn_err,opt_type){
                var data = {
                    fn_suc:fn_suc,
                    fn_err:fn_err||function(){},
                    action:opt_type
                }
                jQuery(this).trigger(jQuery.cstAdapterEvts.form_check_req,data);
            },
            //重写保存外挂表单数据方法
            saveCustomFormData:function(fn_suc,fn_err,opt_type){
                var data = {
                    fn_suc:fn_suc,
                    fn_err:fn_err||function(){},
                    action:opt_type
                }
                jQuery(this).trigger(jQuery.cstAdapterEvts.form_save_data,data);
            },
            setFFText:function(ff_text){
                jQuery(this).data("ff_text",ff_text);
                options.ffTextChanged && options.ffTextChanged(ff_text);
            },
            //更新定制表单数据
            setFFData:function(ff_data){
                var ffd = jQuery(this).data("ff_data");//初始化时，绑定的 tplData.form.form_data 外挂表单事件会触发这个更新
                ffd.main = ff_data.main;
                ffd.children = ff_data.children;
                jQuery(this).data("ff_data",ffd);
                options.ffDataChanged && options.ffDataChanged(ffd);
            },
            getFFData:function(){
                return jQuery(this).data("ff_data");
            },
            getFormData:function(fn_suc,fn_err){                    
                var data = {
                    fn_suc:fn_suc,
                    fn_err:fn_err||function(){}
                }
                jQuery(this).trigger(jQuery.cstAdapterEvts.get_cf_data,data); 
            },
            getPrintHtml:function(fn){
                var data = {
                    fn:fn
                }
                jQuery(this).trigger(jQuery.cstAdapterEvts.get_cf_html,data);
            },
            getCurUserName:function(){
                return jQuery(this).data("user_name");
            },
            iframeDataLoaded:function(ifrmHeight){
                
                if(options.print && !window.printLoaded){
                    window.printLoaded = true;
                    let $this = jQuery(this);
                    $iframe = $this.find("iframe");
                    // $iframe.hide();
                    let $printDiv = jQuery("<div class='print-form'></div>");
                    $this.append($printDiv);
                    $this.getPrintHtml(function(html){
                        // $printDiv.html(html);
                        $this.replaceAndAppendHtml($printDiv,html);
                        options.printLoaded && options.printLoaded($printDiv);
                        $printDiv.css("height",jQuery(".print-form").height()+jQuery("#approveStepsWrap").height());
                        // $iframe.css("height",0);
                    });
                }
            },
            iframeResize:function(){
                options.resize && options.resize();
            },
            replaceAndAppendHtml:function ($printDiv,formHtml) {
                var re = new RegExp("<script[^>]*?>.*?<\/script>", "gi");
                formHtml = formHtml.replace(/\r\n/g, "").replace(re, "");
                $printDiv.html(formHtml); 
    
                //把input textarea 设置为只读
                $printDiv.find("input").each(function () {
                    if (!jQuery(this).is(':hidden')) {
                        var val = jQuery(this).val();
                        jQuery(this).replaceWith(val);
                    }
                });
                $printDiv.find("textarea").each(function () {
                    if (!jQuery(this).is(':hidden')) {
                        var val = jQuery(this).val();
                        jQuery(this).replaceWith(val);
                    }
                });        
                $printDiv.find("iframe").each(function () {
                    var src = jQuery(this).attr("src");
                    if (src== undefined || src.toLowerCase().indexOf("http") < 0) {
                        jQuery(this).attr("src", "javascript:void(0)");
                    }
                });
                $printDiv.find("a").each(function () {
                    jQuery(this).attr("href","javascript:void(0)");
                    jQuery(this).attr("target","");
                });
                //重写图片路径,解决图片抠出来后路径丢失的问题
                $printDiv.find("img").each(function () {
                    var src = jQuery(this).attr("src");
                    if (src != undefined && src.indexOf("http") < 0) {
                        jQuery(this).attr("src", $cf.data("cst_host") + src);
                    }
                });
            }
        });

        options.loaded && options.loaded();
        $cf.trigger(jQuery.cstAdapterEvts.form_loaded);
    }
});
